// package object;
//
// /**
//  * author : yeswater
//  * date : 2023/7/12
//  *
//  * 从 Object 类 copy
//  */
//
// public class Object {
//
//     /**
//      * Java程序要想调用本地方法，需要执行两个步骤：
//      * 1、通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存
//      * 2、当Java程序需要调用本地方法时，虚拟机在加载的动态文件中定位并链接该本地方法，从而得以执行本地方法
//      * <p/>
//      * registerNatives()方法的作用就是取代第二步，让程序主动将本地方法链接到调用方，
//      * 当Java程序需要调用本地方法时就可以直接调用，而不需要虚拟机再去定位并链接
//      */
//     private static native void registerNatives();
//     static {
//         registerNatives();
//     }
//
//     /**
//      *  返回当前运行时对象的 Class 对象,使用了 final 关键字修饰，故不允许子类重写
//      */
//     public final native Class<?> getClass();
//
//     /**
//      * 用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap
//      */
//     public native int hashCode();
//
//     /**
//      * 用于比较 2 个对象的内存地址是否相等，String 类对该方法进行了重写以用于比较字符串的值是否相等
//      */
//     public boolean equals(Object obj) {
//         return (this == obj);
//     }
//
//     /**
//      * 用于创建并返回当前对象的一份拷贝
//      */
//     protected native Object clone() throws CloneNotSupportedException;
//
//     /**
//      * 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方
//      */
//     public String toString() {
//         return getClass().getName() + "@" + Integer.toHexString(hashCode());
//     }
//
//     /**
//      * native 方法，并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个
//      */
//     public final native void notify();
//
//     /**
//      * native 方法，并且不能重写。跟 notify 一样，唯一的区别就是会唤醒在此对象监视器上等待的所有线程，而不是一个线程
//      */
//     public final native void notifyAll();
//
//     /**
//      * native方法，并且不能重写。暂停线程的执行。注意：sleep 方法没有释放锁，而 wait 方法释放了锁 ，timeout 是等待时间。
//      */
//     public final native void wait(long timeout) throws InterruptedException;
//
//     /**
//      * 多了 nanos 参数，这个参数表示额外时间（以毫微秒为单位，范围是 0-999999）。 所以超时的时间还需要加上 nanos 毫秒。。
//      */
//     public final void wait(long timeout, int nanos) throws InterruptedException {
//         if (timeout < 0) {
//             throw new IllegalArgumentException("timeout value is negative");
//         }
//
//         if (nanos < 0 || nanos > 999999) {
//             throw new IllegalArgumentException(
//                     "nanosecond timeout value out of range");
//         }
//
//         if (nanos > 0) {
//             timeout++;
//         }
//
//         wait(timeout);
//     }
//
//
//     /**
//      * 跟之前的2个wait方法一样，只不过该方法一直等待，没有超时时间这个概念
//      */
//     public final void wait() throws InterruptedException {
//         wait(0);
//     }
//
//     /**
//      * 实例被垃圾回收器回收的时候触发的操作
//      */
//     protected void finalize() throws Throwable { }
// }
